﻿using JinianNet.JNTemplate.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using YKPrintService.Service;
using YKPrintService.VO;
using static Org.BouncyCastle.Math.EC.ECCurve;

namespace JTZY.Common
{
    public class XpsdkApi
    {
        /// <summary>
        /// 打印服务对象实例化
        /// </summary>
        private static PrintService service = new PrintService();

        /// <summary>
        /// 批量地添加打印机
        /// </summary>
        public static void addPrinters()
        {
            AddPrinterRequest request = new AddPrinterRequest();
            // 添加公共参数
            Config.createRequestHeader(request);

            //打印机列表
            List<AddPrinterRequestItem> itemList = new List<AddPrinterRequestItem>();

            AddPrinterRequestItem item = new AddPrinterRequestItem();
            //无效打印机编号,此处只是为了举例说明接口返回参数使用，在实际开发中，此处均用有效的打印机编号
            item.Sn = "111";
            item.Name = "X58A";
            itemList.Add(item);

            item = new AddPrinterRequestItem();
            // 打印机编号，必须是真实的打印机编号，否在会导致后续api无法打印
            item.Sn = Config.OK_PRINTER_SN;
            //打印机名称
            item.Name = "X58BTestPrint";
            itemList.Add(item);


            //*必填*：items:数组元素为 json 对象：
            //{"name":"打印机名称","sn":"打印机编号"}
            //其中打印机编号 sn 和名称 name 字段为必填项，每次最多添加50台
            AddPrinterRequestItem[] items = new AddPrinterRequestItem[itemList.Count];
            request.Items = itemList.ToArray();

            ObjectRestResponse<PrinterResult> resp = service.addPrinters(request);
            //resp.data:返回1个 json 对象，包含成功和失败的信息，详看https://www.xpyun.net/open/index.html示例
            //{"code":0,"msg":"ok","data":{"success":["UffietiT46XF2u4","I3kHP4RMcL5jU39"],"fail":["111"]},"serverExecutedTime":0}
            Console.WriteLine(resp.Msg);
        }
        public static ObjectRestResponse<PrinterResult> addPrinters(AddPrinterRequestItem item)
        {
            AddPrinterRequest request = new AddPrinterRequest();
            // 添加公共参数
            Config.createRequestHeader(request);

            //打印机列表
            List<AddPrinterRequestItem> itemList = new List<AddPrinterRequestItem>();

            itemList.Add(item);


            //*必填*：items:数组元素为 json 对象：
            //{"name":"打印机名称","sn":"打印机编号"}
            //其中打印机编号 sn 和名称 name 字段为必填项，每次最多添加50台
            AddPrinterRequestItem[] items = new AddPrinterRequestItem[itemList.Count];
            request.Items = itemList.ToArray();

            ObjectRestResponse<PrinterResult> resp = service.addPrinters(request);
            //resp.data:返回1个 json 对象，包含成功和失败的信息，详看https://www.xpyun.net/open/index.html示例
            //{"code":0,"msg":"ok","data":{"success":["UffietiT46XF2u4","I3kHP4RMcL5jU39"],"fail":["111"]},"serverExecutedTime":0}
            return resp;
        }
        /// <summary>
        /// 设置打印机语音类型
        /// 声音类型： 0真人语音（大） 1真人语音（中） 2真人语音（小） 3 嘀嘀声  4 静音
        /// </summary>
        public static void setVoiceType()
        {
            SetVoiceTypeRequest request = new SetVoiceTypeRequest();
            Config.createRequestHeader(request);
            //*必填*：打印机编号
            request.Sn = Config.OK_PRINTER_SN;
            //*必填*：声音类型： 0真人语音（大） 1真人语音（中） 2真人语音（小） 3 嘀嘀声  4 静音
            request.VoiceType = 0;
            ObjectRestResponse<Boolean> resp = service.setPrinterVoiceType(request);
            //resp.data:返回布尔类型：true 表示设置成功 false 表示设置失败
            Console.WriteLine(resp.Msg);
        }

        /// <summary>
        /// 批量删除打印机
        /// </summary>
        public static ObjectRestResponse<PrinterResult> delPrinters(string Sn)
        {
            DelPrinterRequest request = new DelPrinterRequest();
            Config.createRequestHeader(request);
            //*必填*：打印机编号集合，类型为字符串数组
            String[] snlist = new String[1];
            //*必填*：打印机编号
            snlist[0] = Sn;// Config.OK_PRINTER_SN;
            request.Snlist = snlist;
            ObjectRestResponse<PrinterResult> resp = service.delPrinters(request);
            //resp.data:返回1个 json 对象，包含成功和失败的信息，详看https://www.xpyun.net/open/index.html示例
            //Console.WriteLine(resp.Msg);
            return resp;
        }

        /// <summary>
        /// 修改打印机信息
        /// </summary>
        public static void updPrinter()
        {
            UpdPrinterRequest request = new UpdPrinterRequest();
            Config.createRequestHeader(request);
            //*必填*：打印机编号
            request.Sn = Config.OK_PRINTER_SN;
            //*必填*：打印机名称
            request.Name = "X58C12";

            ObjectRestResponse<Boolean> resp = service.updPrinter(request);
            //resp.data:返回布尔类型：true 表示成功 false 表示失败
            Console.WriteLine(resp.Msg);
        }

        /// <summary>
        /// 清空待打印队列
        /// </summary>
        public static void delPrinterQueue()
        {
            PrinterRequest request = new PrinterRequest();
            Config.createRequestHeader(request);
            //*必填*：打印机编号
            request.Sn = Config.OK_PRINTER_SN;
            ObjectRestResponse<Boolean> resp = service.delPrinterQueue(request);
            //resp.data:返回布尔类型：true 表示成功 false 表示失败
            Console.WriteLine(resp.Msg);
        }

        /// <summary>
        /// 查询订单是否打印成功
        /// </summary>
        public static void queryOrderState()
        {
            QueryOrderStateRequest request = new QueryOrderStateRequest();
            Config.createRequestHeader(request);
            // *必填*：订单编号，由“打印订单”接口返回
            request.OrderId = "OM19111303591262210878";
            ObjectRestResponse<Boolean> resp = service.queryOrderState(request);
            //resp.data:返回布尔类型,已打印返回true,未打印返回false
            Console.WriteLine(resp.Msg);
        }

        /// <summary>
        /// 查询打印机某天的订单统计数
        /// </summary>
        public static void queryOrderStatis()
        {
            QueryOrderStatisRequest request = new QueryOrderStatisRequest();
            Config.createRequestHeader(request);
            //*必填*：打印机编号
            request.Sn = Config.OK_PRINTER_SN;
            //*必填*：查询日期，格式yyyy-MM-dd，如：2020-09-09
            request.Date = "2020-09-09";
            ObjectRestResponse<OrderStatisResult> resp = service.queryOrderStatis(request);
            //resp.data:json对象，返回已打印订单数和等待打印订单数，如：{"printed": 2, "waiting": 0}
            Console.WriteLine(resp.Msg);
        }

        /// <summary>
        /// 查询打印机状态
        /// </summary>
        public static void queryPrinterStatus()
        {
            PrinterRequest request = new PrinterRequest();
            Config.createRequestHeader(request);
            //*必填*：打印机编号
            request.Sn = Config.OK_PRINTER_SN;
            ObjectRestResponse<int> resp = service.queryPrinterStatus(request);
            //resp.data:返回打印机状态值，共三种：
            //0 表示离线
            //1 表示在线正常
            //2 表示在线异常
            //备注：异常一般情况是缺纸，离线的判断是打印机与服务器失去联系超过 30 秒
            Console.WriteLine(resp.Msg);
        }

        /// <summary>
        /// 批量查询打印机状态
        /// </summary>
        public static void queryPrintersStatus()
        {
            PrintersRequest request = new PrintersRequest();
            Config.createRequestHeader(request);
            //*必填*：打印机编号
            List<String> snlist = new List<string>();
            //XXXXXXXXXXX表示实际的设备编号
            snlist.Add("XXXXXXXXXXX");
            snlist.Add("XXXXXXXXXXX");
            snlist.Add("XXXXXXXXXXX");
            request.Snlist = snlist;
            ObjectRestResponse<List<int>> resp = service.queryPrintersStatus(request);
            //resp.data:返回打印机状态值，共三种：
            //0 表示离线
            //1 表示在线正常
            //2 表示在线异常
            //备注：异常一般情况是缺纸，离线的判断是打印机与服务器失去联系超过 30 秒
            Console.WriteLine(resp.Msg);
        }

        /// <summary>
        /// 金额播报
        /// </summary>
        public static void playVoice()
        {
            VoiceRequest request = new VoiceRequest();
            Config.createRequestHeader(request);
            //*必填*：打印机编号
            request.Sn = Config.OK_PRINTER_SN;
            //支付方式：
            //取值范围41~55：
            //支付宝 41、微信 42、云支付 43、银联刷卡 44、银联支付 45、会员卡消费 46、会员卡充值 47、翼支付 48、成功收款 49、嘉联支付 50、壹钱包 51、京东支付 52、快钱支付 53、威支付 54、享钱支付 55
            //仅用于支持金额播报的芯烨云打印机。
            request.PayType = 41;
            //支付与否：
            //取值范围59~61：
            //退款 59 到账 60 消费 61。
            //仅用于支持金额播报的芯烨云打印机。
            request.PayMode = 59;
            //支付金额：
            //最多允许保留2位小数。
            //仅用于支持金额播报的芯烨云打印机。
            request.Money = 24.15;
            ObjectRestResponse<String> resp = service.playVoice(request);
            //resp.data:正确返回0
            Console.WriteLine(resp.Msg);
        }

        public static ObjectRestResponse<String> printFontAlign(string Sn)
        {
            /**
             * <BR>：换行符（同一行有闭合标签(如 </C>)则应放到闭合标签前面, 连续两个换行符<BR><BR>可以表示加一空行）
             *  <L></L>：左对齐
             *  <C></C>：居中对齐
             *  <R></R>：右对齐
             *  注意：同一行内容不能使用多种对齐方式，可通过补空格方式自定义对齐样式。
             *       58mm的机器，一行打印16个汉字，32个字母
             *       80mm的机器，一行打印24个汉字，48个字母
             *
             *  <N></N>：字体正常大小
             *  <HB></HB>：字体变高一倍
             *  <WB></WB>：字体变宽一倍
             *  <B></B>：字体放大一倍
             *  <CB></CB>：字体放大一倍居中
             *  <HB2></HB2>：字体变高二倍
             *  <WB2></WB2>：字体变宽二倍
             *  <B2></B2>：字体放大二倍
             *  <BOLD></BOLD>：字体加粗
             *  <LOGO></LOGO>：LOGO图片（标签内容是图片Base64格式字符串, 暂未开放）
             *  <QR></QR>：二维码（标签内容是二维码值, 最大不能超过256个字符, 单个订单最多只能打印一个二维码）。
             *             二维码宽度设置：可以通过 <QR> 标签名称自定义，如 <QR180> 表示宽度为180，相应的闭合标签 </QR>
             *             不需要指定宽度。<QR> 标签不指定宽度默认为110，最小值为90，最大值为180
             *  <BARCODE></BARCODE>：条形码（标签内容是条形码值）
             */
            StringBuilder printContent = new StringBuilder();
            printContent.Append("不加标签：").Append("默认字体大小<BR>");

            printContent.Append("<BR>");
            printContent.Append("L标签：").Append("<L>左对齐<BR></L>");
            printContent.Append("<BR>");
            printContent.Append("R标签：").Append("<R>右对齐<BR></R>");
            printContent.Append("<BR>");
            printContent.Append("C标签：").Append("<C>居中对齐<BR></C>");

            printContent.Append("<BR>");
            printContent.Append("N标签：").Append("<N>字体正常大小<BR></N>");
            printContent.Append("<BR>");
            printContent.Append("HB标签：").Append("<HB>字体变高一倍<BR></HB>");
            printContent.Append("<BR>");
            printContent.Append("WB标签：").Append("<WB>字体变宽一倍<BR></WB>");
            printContent.Append("<BR>");
            printContent.Append("B标签：").Append("<B>字体放大一倍<BR></B>");
            printContent.Append("<BR>");
            printContent.Append("HB2标签：").Append("<HB2>字体变高二倍<BR></HB2>");
            printContent.Append("<BR>");
            printContent.Append("WB2标签：").Append("<WB2>字体变宽二倍<BR></WB2>");
            printContent.Append("<BR>");
            printContent.Append("B2标签：").Append("<B2>字体放大二倍<BR></B2>");
            printContent.Append("<BR>");
            printContent.Append("BOLD标签：").Append("<BOLD>字体加粗<BR></BOLD>");

            // 嵌套使用对齐和字体
            printContent.Append("<BR>");
            printContent.Append("<C>嵌套使用：").Append("<BOLD>居中加粗</BOLD>").Append("<BR></C>");

            // 打印条形码和二维码
            printContent.Append("<BR>");
            printContent.Append("<C><BARCODE>9884822189</BARCODE></C>");
            printContent.Append("<C><QR>https://www.xpyun.net</QR></C>");


            PrintRequest request = new PrintRequest();
            Config.createRequestHeader(request);
            //*必填*：打印机编号
            request.Sn = Sn;//Config.OK_PRINTER_SN;
            //*必填*：打印内容,不能超过12K
            request.Content = printContent.ToString();
            //打印份数，默认为1
            request.Copies = 1;
            //声音播放模式，0 为取消订单模式，1 为静音模式，2 为来单播放模式，3为有用户申请退单了。默认为 2 来单播放模式
            request.Voice = 2;
            //打印模式：
            //值为 0 或不指定则会检查打印机是否在线，如果不在线 则不生成打印订单，直接返回设备不在线状态码；如果在线则生成打印订单，并返回打印订单号。
            //值为 1不检查打印机是否在线，直接生成打印订单，并返回打印订单号。如果打印机不在线，订单将缓存在打印队列中，打印机正常在线时会自动打印。
            request.Mode = 0;
            ObjectRestResponse<String> resp = service.print(request);
            //resp.data:正确返回订单编号
            //Console.WriteLine(resp.Msg);
            return resp;
        }
    }
}
